﻿// DataProviders/MySqlProvider.cs

using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
using DatabaseManager.Infrastructure.Connections;
using DatabaseManager.Core.Models;

namespace DatabaseManager.DataProviders
{
    /// <summary>
    /// MySQL数据库数据提供器，实现IDataProvider接口
    /// 负责与MySQL数据库交互，提供获取数据库结构信息的各种方法
    /// </summary>
    public class MySqlProvider : IDataProvider
    {
        /// <summary>
        /// SqlSugar客户端实例，用于执行MySQL数据库操作
        /// </summary>
        private readonly ISqlSugarClient _db;

        /// <summary>
        /// 初始化MySqlProvider实例
        /// </summary>
        /// <param name="db">SqlSugar客户端实例，通过依赖注入获取</param>
        public MySqlProvider(ISqlSugarClient db)
        {
            _db = db;
        }

        /// <summary>
        /// 测试与MySQL数据库的连接是否有效
        /// </summary>
        /// <returns>连接有效返回true，否则返回false</returns>
        public bool TestConnection()
        {
            try
            {
                // 执行简单查询验证连接，返回非空结果表示连接有效
                return _db.Ado.GetScalar("SELECT 1") != null;
            }
            catch
            {
                // 发生异常表示连接失败
                return false;
            }
        }

        /// <summary>
        /// 获取当前数据库中所有用户表的基本信息
        /// 排除系统数据库(mysql、information_schema等)中的表
        /// </summary>
        /// <returns>表信息集合，包含表名、所属架构和描述</returns>
        public List<TableInfo> GetTables()
        {
            // 查询information_schema.TABLES系统视图获取表信息
            var sql = @"
                SELECT TABLE_NAME AS Name, TABLE_SCHEMA AS Schema, TABLE_COMMENT AS Description
                FROM information_schema.TABLES
                WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')";

            // 执行SQL查询并将结果映射为TableInfo对象集合
            return _db.Ado.SqlQuery<TableInfo>(sql);
        }

        /// <summary>
        /// 获取指定表的所有列信息
        /// </summary>
        /// <param name="tableName">要查询的表名</param>
        /// <returns>列信息集合，包含列名、数据类型、是否可空等详细属性</returns>
        public List<ColumnInfo> GetColumns(string tableName)
        {
            // 查询information_schema.COLUMNS系统视图获取列信息
            var sql = $@"
                SELECT 
                    COLUMN_NAME AS Name,
                    DATA_TYPE AS DataType,
                    IS_NULLABLE = 'YES' AS IsNullable,
                    COLUMN_DEFAULT AS DefaultValue,
                    COLUMN_COMMENT AS Description,
                    ORDINAL_POSITION AS OrdinalPosition,
                    CASE WHEN COLUMN_KEY = 'PRI' THEN TRUE ELSE FALSE END AS IsPrimaryKey
                FROM information_schema.COLUMNS
                WHERE TABLE_NAME = '{tableName}'
                ORDER BY ORDINAL_POSITION";

            // 执行SQL查询并将结果映射为ColumnInfo对象集合
            return _db.Ado.SqlQuery<ColumnInfo>(sql);
        }

        /// <summary>
        /// 获取MySQL服务器上所有数据库的名称
        /// </summary>
        /// <returns>数据库名称集合</returns>
        public List<string> GetDatabases()
        {
            // 使用SHOW DATABASES命令获取数据库列表
            var sql = "SHOW DATABASES";
            return _db.Ado.SqlQuery<string>(sql).ToList();
        }
    }
}
